package hotel;

import hotel.control.ClientRequest;
import hotel.dao.ApartamentoDao;
import hotel.dao.EntradaDao;
import hotel.dao.HospedeDao;
import hotel.dao.ServicoDao;
import hotel.dao.TipoApartamentoDao;
import hotel.tipos.Apartamento;
import hotel.tipos.Hospede;
import hotel.tipos.Reserva;
import hotel.tipos.Servico;
import hotel.tipos.TipoApartamento;
import hotel.userCtl.Usuario;
import hotel.userCtl.UsuarioDao;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;

public class HotelManagerServer {
	public static void main(String[] args) {
		// Declarar a porta
		final int port = 8080;
		
		// Popula banco com dados de exemplo
		populaBanco();
		
		
		// Abre logo uma sessão do hibernate 
		List l = ApartamentoDao.listarApartamentos();
		
		// Criar o ServerSocket
		try {
			ServerSocket socket = new ServerSocket(port);
			
			// Processa a requisição recebida:
			while(true){
				// Cria um socket para a requisição
				Socket req = socket.accept();
				
				System.out.println("Requisicao recebida, contruindo um objeto ClientRequest");
				
				// Contrói um objeto para processar a requisição
				ClientRequest request = new ClientRequest(req);
				
				// Cria uma nova Thread para processar a requisição
				Thread thread = new Thread(request);
				
				// Inicia a Thread
				thread.start();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public static void populaBanco(){
		
		System.out.println("Populando Banco de dados...");
		
		// Cria 2 usuarios
		Usuario usr1 = new Usuario();
		Usuario usr2 = new Usuario();
		usr1.setUserName("Ze");
		usr2.setUserName("Sa");
		usr1.setType(1);
		usr2.setType(2);
		usr1.setPassword("12345");
		usr2.setPassword("1");
		UsuarioDao.create(usr1);
		UsuarioDao.create(usr2);
		
		// Cria 2 tipos de Apartamentos
		TipoApartamento tipo1 = new TipoApartamento();
		TipoApartamento tipo2 = new TipoApartamento();
		tipo1.setDescricao("Luxo: 2 quartos - 1 suite");
		tipo2.setDescricao("Simples: 1 quarto, vetilador ");
		tipo1.setValorDiaria(10000);
		tipo2.setValorDiaria(3000);
		TipoApartamentoDao.create(tipo1);
		TipoApartamentoDao.create(tipo2);
		
		// Cria 2 Apartamentos
		Apartamento ap1 = new Apartamento();
		Apartamento ap2 = new Apartamento();
		ap1.setNumero(101);
		ap2.setNumero(201);
		ap1.setTipo(tipo1);
		ap2.setTipo(tipo2);
		ApartamentoDao.create(ap1);
		ApartamentoDao.create(ap2);
		
		// Cria 2 servicos
		Servico srv1 = new Servico();
		Servico srv2 = new Servico();
		srv1.setDescricao("Ligacao");
		srv2.setDescricao("Roupa de cama");
		srv1.setPreco(5.0);
		srv2.setPreco(15.0);
		ServicoDao.create(srv1);
		ServicoDao.create(srv2);
		
		// Cria 2 hospedes
		Hospede h1 = new Hospede();
		Hospede h2 = new Hospede();
		h1.setCpf("63867974349");
		h2.setCpf("96380322353");
		h1.setEndereco("Rua a, s/n");
		h2.setEndereco("Rua Jilin, 414 - Peba");
		h1.setNome("Marco Antonio");
		h2.setNome("Soares Neto");
		h1.setTelefone("2345678");
		h2.setTelefone("5555555");
		HospedeDao.create(h1);
		HospedeDao.create(h2);
		
		
		// Cria 1 Reserva
		Reserva reserva = new Reserva();
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		try {
			reserva.setDataInicio(dateFormat.parse("17/06/2010"));
			reserva.setDataFim(dateFormat.parse("07/07/2010"));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		reserva.setAp(ap1);
		reserva.setHospedeId(h1);
		try {
			EntradaDao.create(reserva);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}
